Apex Design Patterns Salesforce Apex কোডে পুনরায় ব্যবহারযোগ্য এবং কার্যকরী সফটওয়্যার ডিজাইন তৈরিতে ব্যবহৃত বিভিন্ন পদ্ধতি। Design Patterns কোডের গঠন, কার্যকারিতা, এবং রক্ষণাবেক্ষণ সহজ করতে সহায়ক। Salesforce-এ বিভিন্ন Design Patterns ব্যবহৃত হয়, যেমন Singleton, Factory, Strategy, Service, এবং Unit of Work Patterns, যা কার্যক্ষম, পরিষ্কার এবং অপ্টিমাইজড কোড তৈরি করতে সাহায্য করে।
Singleton Pattern এমন একটি প্যাটার্ন, যেখানে একটি ক্লাসের শুধুমাত্র একটি ইনস্ট্যান্স তৈরি করা হয় এবং এটি সর্বত্র ব্যবহৃত হয়। এটি বিশেষ করে যখন একটি অবজেক্টের একক ইনস্ট্যান্স রাখা প্রয়োজন, যেমন কনফিগারেশন সেটিংস বা গ্লোবাল ইনস্ট্যান্সে ব্যবহৃত হয়।
public class SingletonExample {
private static SingletonExample instance;
private SingletonExample() {
// Private constructor
}
public static SingletonExample getInstance() {
if (instance == null) {
instance = new SingletonExample();
}
return instance;
}
}
Factory Pattern এমন একটি ডিজাইন প্যাটার্ন, যেখানে একটি ক্লাস বিভিন্ন অবজেক্ট তৈরি করার জন্য ব্যবহার করা হয়। এটি বিভিন্ন অবজেক্ট ক্রিয়েশন লজিককে মেইন কোড থেকে আলাদা করতে সহায়ক।
apex
Copy code
public class ShapeFactory {
public static Shape createShape(String shapeType) {
if (shapeType == 'Circle') {
return new Circle();
} else if (shapeType == 'Square') {
return new Square();
}
return null;
}
}
ShapeFactory
ক্লাসে createShape
মেথড ব্যবহার করে বিভিন্ন অবজেক্ট তৈরি করা হয়েছে।Strategy Pattern হলো একটি Behavioral Design Pattern, যেখানে একই কাজের বিভিন্ন অ্যালগরিদম বা পদ্ধতি আলাদাভাবে সংরক্ষণ করা হয় এবং প্রয়োজন অনুসারে একটিকে নির্বাচন করে কাজ করা হয়।
public interface PaymentStrategy {
void pay(Double amount);
}
public class CreditCardPayment implements PaymentStrategy {
public void pay(Double amount) {
System.debug('Paid ' + amount + ' using Credit Card');
}
}
public class PayPalPayment implements PaymentStrategy {
public void pay(Double amount) {
System.debug('Paid ' + amount + ' using PayPal');
}
}
public class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(Double amount) {
strategy.pay(amount);
}
}
PaymentStrategy
ক্লাসের উপর নির্ভর করে কাজ করে।CreditCardPayment
এবং PayPalPayment
বিভিন্ন পেমেন্ট অ্যালগরিদম আলাদাভাবে সংরক্ষণ করে।Service Layer Pattern হলো এমন একটি প্যাটার্ন, যা ডেটাবেস অপারেশন এবং বিজনেস লজিককে আলাদা করতে সহায়ক। এটি Apex ক্লাসে বড় বড় লজিক এবং ডেটাবেস অপারেশনগুলোকে আলাদা লেয়ারে সংরক্ষণ করে।
public class AccountService {
public List<Account> getAccounts() {
return [SELECT Id, Name FROM Account];
}
public void updateAccount(Account acc) {
update acc;
}
}
AccountService
ক্লাসে Account অবজেক্টের সকল কাজ (যেমন প্রক্রিয়াকরণ, আপডেট) এক স্থানে সংরক্ষণ করা হয়েছে।Unit of Work Pattern হলো এমন একটি প্যাটার্ন, যেখানে একাধিক ডেটাবেস অপারেশন একত্রে পরিচালনা করা হয় এবং শেষে একসাথে কমিট করা হয়। এটি ব্যাচ প্রক্রিয়াকরণের জন্য কার্যকরী।
public class UnitOfWork {
private List<SObject> toInsert = new List<SObject>();
private List<SObject> toUpdate = new List<SObject>();
public void registerInsert(SObject sObj) {
toInsert.add(sObj);
}
public void registerUpdate(SObject sObj) {
toUpdate.add(sObj);
}
public void commit() {
if (!toInsert.isEmpty()) insert toInsert;
if (!toUpdate.isEmpty()) update toUpdate;
}
}
registerInsert
এবং registerUpdate
মেথডে বিভিন্ন ডেটাবেস অপারেশন সংরক্ষণ করা হয়েছে।commit
মেথডে সমস্ত অপারেশন একত্রে কমিট করা হয়।Apex Design Patterns Salesforce-এ কোডকে আরও রিডেবল, রিইউজেবল এবং কার্যক্ষম করতে সহায়ক। বিভিন্ন Design Patterns যেমন Singleton, Factory, Strategy, Service Layer, এবং Unit of Work Pattern ব্যবহার করে বিভিন্ন পরিস্থিতিতে কোডের কার্যকারিতা বাড়ানো যায়। Best Practices এবং Design Patterns অনুসরণ করে Apex কোডের কার্যক্ষমতা বৃদ্ধি করা যায় এবং Maintenance সহজ হয়।
Singleton Pattern হলো একটি ডিজাইন প্যাটার্ন, যা একটি ক্লাসের একক ইনস্ট্যান্স তৈরি করতে এবং সেই একক ইনস্ট্যান্স অ্যাপ্লিকেশন জুড়ে পুনরায় ব্যবহার করতে সহায়ক। এটি Creational Design Pattern-এর অন্তর্গত এবং Salesforce সহ বিভিন্ন প্রোগ্রামিং ভাষায় ব্যবহৃত হয়। Singleton Pattern অ্যাপ্লিকেশন জুড়ে ক্লাসের ইনস্ট্যান্স ম্যানেজ করতে সহায়ক, বিশেষ করে যখন একই ইনস্ট্যান্স বারবার প্রয়োজন হয়।
Apex-এ Singleton Pattern প্রয়োগ করতে হলে একটি ক্লাস তৈরি করতে হবে, যা একটি Private Constructor এবং Static Method ব্যবহার করে একক ইনস্ট্যান্স তৈরি করে। নিচে একটি Singleton Pattern এর উদাহরণ দেয়া হলো:
public class SingletonExample {
// ক্লাসের একক ইনস্ট্যান্স স্ট্যাটিক ভেরিয়েবল হিসেবে সংরক্ষণ করা হয়েছে
private static SingletonExample instance = null;
// Private Constructor যাতে বাহির থেকে সরাসরি ইনস্ট্যান্স তৈরি করা না যায়
private SingletonExample() {
// Constructor কোড
}
// ক্লাসের একক ইনস্ট্যান্স রিটার্ন করার স্ট্যাটিক মেথড
public static SingletonExample getInstance() {
if (instance == null) {
instance = new SingletonExample();
}
return instance;
}
// অন্যান্য মেথড বা প্রোপার্টিজ
public void showMessage() {
System.debug('Singleton instance is working!');
}
}
// প্রথমবার getInstance() মেথড কল করলে নতুন ইনস্ট্যান্স তৈরি হবে
SingletonExample singleton = SingletonExample.getInstance();
singleton.showMessage();
// পুনরায় getInstance() কল করলে একই ইনস্ট্যান্স রিটার্ন করবে
SingletonExample singleton2 = SingletonExample.getInstance();
System.debug(singleton == singleton2); // Output: true (দুইটি ইনস্ট্যান্স একই)
instance
হিসেবে সংরক্ষণ করা হয়েছে।instance
ভেরিয়েবল null
হয়, তাহলে নতুন ইনস্ট্যান্স তৈরি করে এবং একই ইনস্ট্যান্স পুনরায় ব্যবহার করা হয়।Configuration বা Settings Data ম্যানেজ করা: অ্যাপ্লিকেশন জুড়ে যেখানে একই কনফিগারেশন বা সেটিংস ডেটা প্রয়োজন সেখানে Singleton Pattern ব্যবহার কার্যকর।
Cache Data সংরক্ষণ: যেখানে বারবার একই ডেটা রিকোয়েস্ট করা হয়, সেখানে Singleton Pattern Cache Data হিসেবে ব্যবহার করে কার্যক্ষমতা উন্নত করতে পারে।
Utility বা Helper Classes: যেখানে নির্দিষ্ট ইউটিলিটি ফাংশন বা Helper ক্লাসের ইনস্ট্যান্স একবার তৈরি করে অ্যাপ্লিকেশন জুড়ে ব্যবহৃত হতে পারে।
Logging এবং Debugging ম্যানেজ করা: লগিং বা ডিবাগিং কার্যক্রমে Singleton Pattern ব্যবহার করে একক ইনস্ট্যান্সের মাধ্যমে লগ ডেটা ম্যানেজ করা যায়।
Lazy Initialization: Singleton Pattern-এ getInstance()
মেথডে instance
null
থাকলে তবেই নতুন ইনস্ট্যান্স তৈরি করুন, যা মেমোরি অপটিমাইজেশন নিশ্চিত করে।
Thread Safety: একই সাথে একাধিক থ্রেডে অ্যাক্সেস করতে হলে Thread Safe Singleton তৈরি করুন, তবে Apex Async environment-এ সাধারণত এটি গুরুত্বপূর্ণ নয়।
Exception Handling: Singleton ক্লাসে Exception Handling যুক্ত করুন, যাতে ডেটা বা ইনস্ট্যান্স ব্যবহার করার সময় কোনো ত্রুটি হলে সঠিক বার্তা প্রদান করা যায়।
Singleton Pattern Apex সহ বিভিন্ন প্রোগ্রামিং ভাষায় ব্যবহৃত একটি ডিজাইন প্যাটার্ন, যা একটি ক্লাসের একক ইনস্ট্যান্স তৈরি করতে এবং তা অ্যাপ্লিকেশন জুড়ে পুনরায় ব্যবহার করতে সহায়ক। এটি মেমোরি ব্যবহারের কার্যক্ষমতা বাড়ায়, কনসিসটেন্সি নিশ্চিত করে এবং ডেটা অ্যাক্সেস সহজতর করে। Apex-এ Singleton Pattern ব্যবহার করে অ্যাপ্লিকেশন আরও কার্যকর এবং সুরক্ষিত রাখা যায়।
Factory Pattern এবং Strategy Pattern হলো দুইটি গুরুত্বপূর্ণ ডিজাইন প্যাটার্ন, যা Apex (Salesforce)-এ কোডের স্থায়িত্ব, রিইউজেবলিটি, এবং মেইনটেনেবিলিটি বৃদ্ধিতে সহায়ক। নিচে এই প্যাটার্নগুলো নিয়ে আলোচনা করা হলো:
Factory Pattern হল একটি Creational Design Pattern, যা ক্লায়েন্টের সাথে সরাসরি কোনো নির্দিষ্ট ক্লাসের উপর নির্ভরশীলতা কমায়। এর মাধ্যমে আমরা একটি Factory Class তৈরি করি, যা নির্দিষ্ট ক্রাইটেরিয়ার ভিত্তিতে বিভিন্ন ধরনের অবজেক্ট তৈরি করে।
ধরুন, আমরা বিভিন্ন ধরনের Notification (যেমন Email, SMS) তৈরি করবো:
public interface Notification {
void send(String message);
}
public class EmailNotification implements Notification {
public void send(String message) {
System.debug('Sending Email: ' + message);
}
}
public class SMSNotification implements Notification {
public void send(String message) {
System.debug('Sending SMS: ' + message);
}
}
public class NotificationFactory {
public static Notification createNotification(String type) {
if (type == 'EMAIL') {
return new EmailNotification();
} else if (type == 'SMS') {
return new SMSNotification();
}
return null;
}
}
// Usage
Notification notification = NotificationFactory.createNotification('EMAIL');
notification.send('Hello!');
Strategy Pattern হলো একটি Behavioral Design Pattern, যা একই কাজের বিভিন্ন অ্যালগরিদমের জন্য ভিন্ন ভিন্ন স্ট্র্যাটেজি (অ্যালগরিদম) আলাদা করে রাখে। এর ফলে আমরা রানটাইমে অ্যালগরিদমগুলো পরিবর্তন করতে পারি।
ধরুন, আমাদের কাছে বিভিন্ন পেমেন্ট মেথড রয়েছে, যেমন CreditCard ও PayPal।
public interface PaymentStrategy {
void pay(Decimal amount);
}
public class CreditCardPayment implements PaymentStrategy {
public void pay(Decimal amount) {
System.debug('Paid ' + amount + ' using Credit Card');
}
}
public class PayPalPayment implements PaymentStrategy {
public void pay(Decimal amount) {
System.debug('Paid ' + amount + ' using PayPal');
}
}
public class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(Decimal amount) {
strategy.pay(amount);
}
}
// Usage
PaymentContext context = new PaymentContext(new CreditCardPayment());
context.executePayment(100.00);
context = new PaymentContext(new PayPalPayment());
context.executePayment(200.00);
এই প্যাটার্নগুলো ব্যবহার করে আপনি Apex-এ আপনার কোডের স্থায়িত্ব এবং রিইউজেবলিটি বাড়াতে পারবেন।
Observer Pattern এবং Decorator Pattern হলো দুটি Behavioral Design Patterns, যা Salesforce-এর Apex কোডে বিভিন্ন ক্ষেত্রে ব্যবহৃত হয়।
Observer Pattern ব্যবহৃত হয় যখন একটি অবজেক্টের স্টেট পরিবর্তন হলে সেটি সাথে সাথে অন্য অবজেক্টগুলোকেও নোটিফাই করতে হয়। এই প্যাটার্ন সাধারণত Event-Driven সিস্টেমে ব্যবহৃত হয়। Apex-এ, এটি Notifications বা কোনো Event-এর উপর ভিত্তি করে বিভিন্ন শ্রেণীর অবজেক্টকে আপডেট করতে সহায়ক।
ধরুন, আমাদের একটি Order সিস্টেম আছে যেখানে অর্ডার কনফার্ম হলে বিভিন্ন অবজেক্ট, যেমন Email Service, SMS Service, এবং Logging Service, নোটিফাই হবে।
// Observer Interface
public interface Observer {
void update(String message);
}
// Concrete Observers
public class EmailService implements Observer {
public void update(String message) {
System.debug('Sending email: ' + message);
}
}
public class SMSService implements Observer {
public void update(String message) {
System.debug('Sending SMS: ' + message);
}
}
// Subject Class
public class Order {
private List<Observer> observers = new List<Observer>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
public void confirmOrder() {
// Order Confirmation Logic
System.debug('Order confirmed');
notifyObservers('Order has been confirmed!');
}
}
// Usage
public class OrderSystem {
public static void run() {
Order order = new Order();
order.attach(new EmailService());
order.attach(new SMSService());
order.confirmOrder();
}
}
Decorator Pattern ব্যবহার করা হয় একটি অবজেক্টে নতুন নতুন behavior যোগ করতে, তাও inheritance ছাড়া। এটি Apex-এ বিশেষভাবে উপকারী যখন runtime-এ object-এর behavior dynamically পরিবর্তন করতে হয়।
ধরুন, আমাদের একটি Notification সিস্টেম আছে, যেখানে আমরা একটি Basic Notification পাঠাতে চাই। কখনো আমরা SMS, কখনো Email, আবার কখনো SMS এবং Email উভয়ই যুক্ত করতে চাই। Decorator Pattern ব্যবহার করে আমরা এই behavior-গুলো যোগ করতে পারি।
// Notifier Interface
public interface Notifier {
void send();
}
// Basic Notifier
public class BasicNotifier implements Notifier {
public void send() {
System.debug('Sending basic notification');
}
}
// SMS Decorator
public class SMSDecorator extends BasicNotifier {
private Notifier notifier;
public SMSDecorator(Notifier notifier) {
this.notifier = notifier;
}
public void send() {
notifier.send();
System.debug('Sending SMS notification');
}
}
// Email Decorator
public class EmailDecorator extends BasicNotifier {
private Notifier notifier;
public EmailDecorator(Notifier notifier) {
this.notifier = notifier;
}
public void send() {
notifier.send();
System.debug('Sending Email notification');
}
}
// Usage
public class NotificationSystem {
public static void run() {
// Basic notification
Notifier basicNotifier = new BasicNotifier();
basicNotifier.send();
// SMS notification
Notifier smsNotifier = new SMSDecorator(basicNotifier);
smsNotifier.send();
// SMS and Email notification
Notifier emailSmsNotifier = new EmailDecorator(smsNotifier);
emailSmsNotifier.send();
}
}
এই দুটি Pattern ব্যবহার করে Apex কোডের modularity এবং flexibility বাড়ানো যায়, যা অ্যাপ্লিকেশনকে আরও maintainable করে তোলে।
Salesforce-এর Apex-এ Design Patterns ব্যবহার করে কোডিংয়ের গুণমান ও maintainability বাড়ানো সম্ভব। তবে design patterns ব্যবহারের সময় কিছু Best Practices মেনে চলা গুরুত্বপূর্ণ। এখানে Apex-এ Design Patterns ব্যবহার করার কিছু Best Practices দেওয়া হলো:
Unit of Work
Pattern Salesforce প্ল্যাটফর্মের DML এবং SOQL সংক্রান্ত লিমিটেশনের জন্য একটি ভালো পছন্দ।এসব Best Practices অনুসরণ করে Design Patterns সঠিকভাবে প্রয়োগ করলে Apex কোড হবে আরও সহজ, মজবুত, এবং maintainable।
Read more